<?

// Рекурсивная функция замены по всему массиву
function arrayReplace (&$val, &$key, $arrayPattern) {
	//echo '$key= `'.$key.'`, $val= `'.$val.'`<br/>';
	//array_show($arrayPattern,'$arrayPattern');
	$val = str_replace((array)array_keys($arrayPattern),(array)array_values($arrayPattern),$val);
	//echo '$val= `'.$val.'`<br/>';
}


// обработка кол. байт и конвертирование в удобочитаемый вид
// Приходят данные: цифра в байтах
function sizeInKb ($size, $params=array()) {
	if (!isset($params['onlySep']))				$params['onlySep'] = false;
	if (!isset($params['sep']))				$params['sep'] = '.';
	if ($params['onlySep']) {
		//echo '$size= '.$size.'<br/>';
		for ($i=0,$iMax=strlen($size); $i<$iMax; $i+=3) {
		//for ($iMax=strlen($size),$i=0; $iMax>0; $i-=3) {
			//echo '$iMax= '.$iMax.', $i= '.$i.', $i= '.substr($size,$iMax-$i,3).'<br/>';
			$sizeNew = substr($size,$iMax-$i,3);
			if ($sizeNew!='') $sizeArr[] = substr($size,$iMax-$i,3);
		}
		//array_show($sizeArr,'$sizeArr');
		$sizeArrCount = count($sizeArr)*3;
		if ($iMax>$sizeArrCount) {
			$sizeArr[] = substr($size,0,$iMax-$sizeArrCount);
		}
		$sizeNew = implode($params['sep'],array_reverse($sizeArr));
		//echo '$sizeNew= '.$sizeNew.'<br/>';
		return $sizeNew.' bytes';
	} else {
		if ($size<=1024) return $size.' bytes';
		elseif ($size<=1048576) return round($size/(1024)).' Kb';
		elseif ($size<=1073741824) return round($size/1048576).' Mb';
		elseif ($size<=1099511627776) return round($size/1073741824).' Gb';
		elseif ($size<=1125899906842624) return round($size/1099511627776).' Tb'; //:)))
		else return round($size/1125899906842624).' Pb'; // ;-)
	}
	//if ($size >= 1073741824) $size = round($size / 1073741824 * 100) / 100 . " Gb";
	//elseif ($size >= 1048576) $size = round($size / 1048576 * 100) / 100 . " Mb";
	//elseif ($size >= 1024) $size = round($size / 1024 * 100) / 100 . " Kb";
	//else $size = $size . " byte";
	//return $size;
} // Функция возвращает: число байтов со словом (Pb/Tb/Gb/Mb/Kb/bytes)


// Печатает на экране свойства массива ( ТЕСТОВАЯ ФУНКЦИЯ )
function array_show ($array, $arrayName='', $deep=0) {
	if ($deep==0) {
		?><DIV style="padding-top:15px;">Массив<?=($arrayName)?'<B>[<u>'.$arrayName.'</u>]</B>':''?>: <UL><DIV style="width:100%;" align="left"><?
	}
	$deepNext = $deep+1;
	//foreach ($array as $key=>$val) {
	@reset ($array);
	while ($element = @each($array)) {
		?><UL><?
		if (is_array($element['value'])) {
			?><LI>Массив <B>[<u><?=$element['key']?></u>]</B></LI><?
			//array_show ($element['value'], '', $deepNext);
			array_show ($element['value'], $element['key'], $deepNext);
		} else {
			?><LI><?=$element['key'].' - '.htmlspecialchars($element['value'])?></LI><?
		}
		?></UL><?
	}
	@reset ($array);
	if ($deep==0) {
		?></DIV></UL></DIV><?
	}
}
// Печатает на экране свойства переменной/массива/объекта
function trace ($obj){
	print ('<'.'pr'.'e'.'>');
	print htmlspecialchars(trace_recurse($obj));
	print ("</pr"."e"."><br/>");
}
function trace_recurse ($obj,$indent="",$cr="\n"){
	if(is_array($obj)){
		$str="array(".$cr;
		$flg=0;
		foreach($obj as $k=>$v){
			$flg=1;
			if(is_int($k))
							$str .= $indent."\t".$k." => ";
			else
							$str .= $indent."\t'".addcslashes($k, "'\\")."' => ";
			
			$str .= trace_recurse($v,$indent."\t",$cr).",".$cr;
		}
		if($flg) $str = substr($str, 0, -1-strlen($cr)).$cr; // лишняя запятая
		$str .= $indent.")";
		return $str;
	}
	if(is_bool($obj)) return (!$obj)?'false':'true';
	elseif(is_int($obj)) return $obj+0;
	else return "'".strtr(addcslashes($obj, "'\\"),array("\r"=>"\\r","\v"=>"\\v","\t"=>"\\t","\n"=>"\\n"))."'";
}


// The Win XP / 2003 workaround script will also work with windows 2000 with a few slight modifications.
// Please note that you'll need the pslist.exe utility, 
// from http://www.sysinternals.com/Utilities/PsTools.html because win/2000 itself does not provide a task list utility.
function getMemUsage () {
	//echo 'getmypid()= '.getmypid().'<br/>';
	if (function_exists('memory_get_usage')) {
		return sizeInKb(memory_get_usage(),array('onlySep'=>true));
	} elseif (substr(PHP_OS,0,3)=='WIN') {
		//echo '1<br/>';
		$resultRow = 8;
		$resultRowItemStartPosition = 34;
		$resultRowItemLength = 8;
		$output = array();
		exec('pslist -m '.getmypid(),$output);
		//array_show($output,'$output');
		return sizeInKb(trim(substr($output[$resultRow],$resultRowItemStartPosition,$resultRowItemLength)));
	} elseif (substr(PHP_OS,0,3)=='WIN') {
		//echo '2<br/>';
		// Windows 2000 workaround
		$output = array();
		exec('pslist '.getmypid(),$output);
		return sizeInKb(trim(substr($output[8],38,10)));
	} elseif (strpos(strtolower($_ENV['OS']),'windows')!==false)	{ // A quick and dirty Windows XP / 2003 wordaround
		//echo '3<br/>';
		// Windows workaround
		$output = array();
		exec('tasklist /FI "PID eq '.getmypid().'" /FO LIST',$output);
		//echo '$output[5]= '.$output[5].'<br/>';
		return sizeInKb(substr($output[5],strpos($output[5],':')+1));
	} else {
		return '<b style="color:red;">no value</b>';
	}
}


// Генератор пароля
function randString ($pass_len=10,$tpl='') {
	$allchars = (!empty($tpl)) ? $tpl : 'abcdefghijklnmopqrstuvwxyzABCDEFGHIJKLNMOPQRSTUVWXYZ0123456789' ;
	$string = '';
	//mt_srand ((double) microtime() * 1000000);
	for ($i=0; $i<$pass_len; $i++) {
		//echo '$i= '.$i.', $i= '.$i.'<br />';
		//$string .= $allchars{mt_rand (0,strlen($allchars)-1)};
		$string .= $allchars{rand(0,strlen($allchars)-1)};
		//echo '$i= '.$i.', $string= `'.$string.'`<br />';
	}
	return $string;
}


// вывод сообщения об ошибке
// errorsPrint - старое название !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
function printErr ($errorArray=array()) { // , $ret=FALSE, $type=FALSE
	global $Core;
	if (!count($errorArray)) $errorArray = &$GLOBALS['errors'];
	/*switch ($type) {
		case 0:		$divID = 'error';break;
		case 1:		$divID = 'errorSmall';break;
		case 2:		$divID = 'errorNormal';break;
		default:	$divID = 'error';
	}*/
	//echo 'count($errorArray)= '.count($errorArray).'<br/>';
	if (is_array($errorArray)) {
		//array_show($errorArray);
		
		//$errorArray = array_merge_recursive ($errorArray);
		//$errorArray['Поле `Название языка`'] = array_merge((array)$errorArray['Поле `Название языка`'],(array)'Бля-бля-бля...');
		foreach ($errorArray as $keyError=>$valError) {
			//echo '$keyError= '.$keyError.', $keyError= '.$valError.', is_array($valError)= '.is_array($valError).'<br />';
			if (is_array($valError)) {
				foreach ($valError as $keyE=>$valE) {
					//if (!compare($valE,$errorArrayNew[$keyError],'str_in_arr','is')) {
					//echo 'count($errorArrayNew)= '.count($errorArrayNew).', count($errorArrayNew['.$keyE.'])= '.count($errorArrayNew[$keyE]).', is_array($errorArrayNew[$keyE])= '.is_array($errorArrayNew[$keyE]).'<br />';
					//if ((!isset($errorArrayNew[$keyE]) OR is_array($errorArrayNew[$keyE])) AND (!count($errorArrayNew[$keyE]) OR !in_array($valE,$errorArrayNew[$keyE]))) {
					//array_show($errorArrayNew[$keyError],'$errorArrayNew['.$keyError.']');
					if (!count($errorArrayNew[$keyError]) OR !in_array($valE,$errorArrayNew[$keyError])) {
					//if (count($errorArrayNew[$keyE]) AND !in_array($valE,$errorArrayNew[$keyE]) AND !in_array($valE,$errorArrayNew)) {
						//$errorArrayNew[$keyError][] = $valE;
						//array_push($errorArrayNew[$keyError],$valE);
						$errorArrayNew[$keyError] = array_merge((array)$errorArrayNew[$keyError],(array)$valE);
					}
				}
			//} elseif (count($errorArrayNew) AND !in_array($valError,$errorArrayNew)) {
			} else {
				//$errorArrayNew[] = $valError;
				$errorArrayNew = array_merge((array)$errorArrayNew,(array)$valError);
			}
		}
		
		
		
		//array_show($errorArray);
		//array_show($errorArrayNew);
		if (count($errorArrayNew)) {
			$return = '<DIV class="errors">';
			//foreach ($errorArray as $keyError=>$valError) {
			foreach ($errorArrayNew as $keyError=>$valError) {
				//echo 'count($valError)= '.count($valError).'<br/>';
				//echo 'keyError= '.$keyError.', $valError= '.$valError.'<br/>';
				if (is_array($valError)) {
					$class = (count($valError)>1) ? 'errorNum' : 'error' ;
					$return .= '<DIV class="error">'.$Core->GetWord('Field').' <SPAN class="errorKey">'.$keyError.':</SPAN> ';
					//echo 'count($valError)= '.count($valError).', $class= '.$class.'<br/>';
					//array_show($valError,'$valError');
					foreach ($valError as $key=>$val) {
						if (count($valError)>1) {
							$return .= '<DIV class="'.$class.'">'.($key+1).'. <SPAN class="errorVal">'.$val.'</SPAN></DIV>';
						} else {
							$return .= '<SPAN class="errorVal">'.$val.'</SPAN>';
						}
						/*if (!empty($key) AND !empty($val)) {
							$return .= '<DIV class="'.$class.'">'.$Core->GetWord('Field').' <SPAN class="errorKey">'.$key.':</SPAN> <SPAN class="errorVal">'.$val.'</SPAN></DIV>';
						} elseif (!empty($val)) {
							$return .= '<DIV class="'.$class.'">'.$Core->GetWord('Field').' <SPAN class="errorVal">'.$val.'</SPAN></DIV>';
						} else $return .= '<DIV class="'.$class.'">'.$Core->GetWord('Field').' <SPAN class="errorKey">'.$key.':</SPAN></B></DIV>';
						*/
					}
					$return .= '</DIV>';
				} elseif (is_string($valError)) {
					$return .= '<DIV class="error">'.$valError.'</DIV>';
				}
			}
			$return .= '</DIV>';
		}
	}/* elseif (is_string($errorArray)) {
		$return .= '<DIV align="center" class="errors">'.$Core->GetWord('Field').$errorArray.'</DIV>';
	}*/
	//($ret) ? return $return : echo $return ;
	
	
	
	return $return;
}


////////////////////////////////////////////////// Работа с кодировками - cp1251,utf8 //////////////////////////////////////////////////

// Проверка на UTF-8
function IsUtf ($str){
	return (iconv("UTF-8","UTF-8",$str)==$str) ? true : false ;
}
// Есть текст с вставленными HTML Entities вида &#XXXX;. Необходимо все entities преобразовать в символы кодировки windows-1251 - END
// Есть текст с вставленными HTML Entities вида &#XXXX;. Необходимо все entities преобразовать в символы кодировки utf8
function entities2utf ($t) {
	//return preg_replace_callback('/&#(\d+);/s', 'entities2windows_callback', $t);
	return preg_replace_callback('/&#(\d+)/s', 'entities2utf_callback', $t);
}
function entities2utf_callback ($p) {
	$c = $p[1];
	//echo '$c= '.$c.'<br/>';
	//if ($c < 256) $return = chr($c);
	//else {
		if (function_exists('iconv')) {// Только при наличии модуля `ICONV`
			//echo 'function_exists(`iconv`)= '.function_exists('iconv').'<br />';
			$u = pack('n', $c);
			////return @iconv('UCS-2BE', "utf8", $u);
			return iconv('UCS-2BE', "UTF-8", $u);
		}
	//}
	//echo '$return= '.$return.'<br/>';
	return $return;
}
// Есть текст с вставленными HTML Entities вида &#XXXX;. Необходимо все entities преобразовать в символы кодировки utf8 - END
// Undo JS's escape() function.
function unescape2utf($s) {
	$s = preg_replace_callback('/%(?: u([A-F0-9]{1,4})|([A-F0-9]{1,2}))/sxi', 'unescape2utf_callback', $s);
	return $s;
}
// Inplace entity replacement.
function unescape2utf_callback($p) {
	if (function_exists('iconv')) {// Только при наличии модуля `ICONV`
		if ($p[1]) {
			$u = pack('n', $dec=hexdec($p[1]));
			$c = @iconv('UCS-2BE', 'UTF-8', $u);
		}
		return $c;
	}
	return $p[1];
}


//function translit ($s,$re=0) {
function translit ($s, $params=array()) {
	if (!isset($params['re'])) $params['re'] = false;
	if (!isset($params['url'])) $params['url'] = true;
	$translit = array('а'=>'a','б'=>'b','в'=>'v','г'=>'g','д'=>'d','е'=>'e','ё'=>'e','ж'=>'j',
	'з'=>'z','и'=>'i','й'=>'y','к'=>'k','л'=>'l','м'=>'m','н'=>'n','о'=>'o','п'=>'p','р'=>'r',
	'с'=>'s','т'=>'t','у'=>'u','ф'=>'f','х'=>'h','ц'=>'ts','ч'=>'ch','ш'=>'sh','щ'=>'sch',
	'ъ'=>"'",'ы'=>'i','ь'=>"'",'э'=>'e','ю'=>'yu','я'=>'ya',
	'і'=>'i','ї'=>'i','є'=>'e', // украинские буквы
	'А'=>'A','Б'=>'B','В'=>'V','Г'=>'G','Д'=>'D','Е'=>'E','Ё'=>'E','Ж'=>'J','З'=>'Z','И'=>'I',
	'Й'=>'Y','К'=>'K','Л'=>'L','М'=>'M','Н'=>'N','О'=>'O','П'=>'P','Р'=>'R','С'=>'S','Т'=>'T',
	'У'=>'U','Ф'=>'F','Х'=>'H','Ц'=>'TS','Ч'=>'CH','Ш'=>'SH','Щ'=>'SCH','Ъ'=>"'",'Ы'=>'I',
	'Ь'=>"'",'Э'=>'E','Ю'=>'YU','Я'=>'YA',
	'І'=>'I','Ї'=>'I','Є'=>'E', // украинские буквы
	);
	//return ($params['re']) ? str_replace(array_values($translit),array_keys($translit),$s) : str_replace(array_keys($translit),array_values($translit),$s) ;
	if ($params['re']) { // Из англ. в русский
		if ($params['url']) {
			$return = str_replace('-',' ',$s);
		}
		$return = str_replace(array_values($translit),array_keys($translit),$s);
	} else { // Из русского в англ.
		$return = str_replace(array_keys($translit),array_values($translit),$s);
		//echo '$return(0)= `'.$return.'`<br/>';
		if ($params['url']) {
			$return = strtolower($return); // в нижний регистр
			//echo '$return(1)= `'.$return.'`<br/>';
			$return = preg_replace('/[\s]+/','-',$return); // Заменям пробелы на "-"
			//echo '$return(2)= `'.$return.'`<br/>';
			$return = preg_replace('/[^-a-z0-9_]+/s','',$return); // Заменям все ненужное нам на "пустоту"
			//echo '$return(3)= `'.$return.'`<br/>';
			$return = preg_replace('/[-]+/','-',$return); // Заменям все ненужное нам на "пустоту"
			//echo '$return(4)= `'.$return.'`<br/>';
			$return = trim($return,'-'); // удаляем начальные и конечные '-'
			//echo '$return(5)= `'.$return.'`<br/>';
		}
	}
	//echo '$s= `'.$s.'`, $return(final)= `'.$return.'`<br/>';
	return $return;
}

////////////////////////////////////////////////// Работа с кодировками - cp1251,utf8 - END //////////////////////////////////////////////////


?>